/**
 * axios 封装
 */
import axios from "axios";
import {
    Toast,
    Dialog
} from "vant";
import router from "@/router";

//导入本地存储方法
import {
    getStorageToken,
    removeStorageToken
} from "@/utils/storage.js"

// 创建一个 axios 实例
const service = axios.create({
    withCredentials: true, // send cookies when cross-domain requests
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 5000, // 设定响应超时
});

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token，显示loading
 */
service.interceptors.request.use((config) => {
    //如果本地有Token(用户已登录），让Axios携带这个Token，在header.authorization
    const token = getStorageToken();
    if (token)
        config.headers.token = token;

    // 在发送请求之前做些什么
    Toast.loading('加载中...'); // 显示loading
    return config;
}, (error) => {
    Toast.clear(); // 隐藏loading
    // 对请求错误做些什么
    console.log(error);
    return Promise.reject(error);
});

/**
 * 响应拦截器，
 * 每次响应的格式
 * { code => 状态码, msg => '响应信息', data => 数据 }
 */
service.interceptors.response.use((response) => {
    Toast.clear(); // 隐藏loading
    const result = response.data; //注意后端返回的数据格式 result = { code msg data }
    if (result.code == 200) { //注意返回的code值的含义  success
        return Promise.resolve(result); //返回成功
    } else {
        // 如果Token错误（用户没登录 或 Token过期）
        if (result.code === 401) {
            Dialog.confirm({
                title: "要重新登录吗?",
                message: result.message,
            }).then(() => {
                removeStorageToken(); //清除本地保存的Token

                //跳转到 Login ,并传递参数（登录后返回的路径)
                router.push({
                    name: 'login',
                    params: {
                        redirect: router.currentRoute.path
                    }
                });
            }).catch(() => {
                //路由跳转到首页
                router.push({
                    name: "home"
                });
            });
        } else {
            Dialog.alert({
                title: "响应错误",
                message: result.message
            });
        }

        return Promise.reject(new Error(result.message || "未知的响应错误"));

    }
}, (error) => {
    //控制台错误提示
    console.error("响应出错:" + error); // for debug
    Toast.clear(); // 隐藏loading

    // 全局错误提示
    Dialog.alert({
        title: "响应拦截器错误",
        message: error.message
    });
    return Promise.reject(error);
});

//默认引出
export default service;
